traits,abstract שימושים
הבנתי אותם והכול , אבל יש לי כמה שאלות בקשר לשימושים שלהם..
מג1. Traits הם בעצם קלאסים שיכולים לעזור לי בהרבה מחלקות, ויותר פשוט להשתמש בזה מאשר להוריש כל פעם . דוגמה לטרייט היא טרייט שמטפל במערכים? או בפעולות מתמטיות ? או בכול דבר כזה או אחר שקשור לדברים גלובאליים? כי אם זה היה משו לוקאלי, מקומי אז היייתי משתמש בהורשה - לא ככה?
2. למה אני צריך קלאס אבסטראקטי? באמת שעדיין לא הבנתי את השימוש שלו..
אשמח להסברים :) תודה :)
6 תשובות
1. כמו ש-iiddaannyy אמר פעם, ירושה ממחלקה היא פעולה של הרחבת המחלקה, לוגית. Traits נועדו לפונקציונליות מסוימת, למשל ל-Singelton.
2. שמעת פעם על Interface? הוא בעצם מציג את הדרישות של המחלקה מבחוץ. כלומר מה יהיה אפשר לגשת אליו מחוץ למחלקה. עכשיו, מחלקה אבסטרקטית היא הרבה מעבר לכך - היא מציגה את הדרישות של המחלקה גם מבחוץ וגם מבפנים, כלומר גם למפתח שמשתמש במחלקה, וגם למפתח שמפתח את המחלקה. מחלקה אבסטרקטית גם יכולה להציע יישומים שונים של פונקציות וכדו'.
1. סינגלטון זה לא תבנית למחלקה ?
2. וכן שמעתי, ועדיין לא הבנתי מה ההבדל בעצם.. ההבדלים שאני יודע בניהם הם :
באינטרפייס חייב לממש את כל המתודות - בקלאס אבסטרקטי לא ,
באינטרפייס כל המתודות הן מסוג public
באינטרפייס אסור לממש את המתודות
אבל בקלאס אבסטרקטי, אם לא מימשתי את.הפעולות - הן עדיין יפעלו? כמו שבtrait הפעולות פועלות גם בלי שמימשו אותן?
trait זה כשהקומפיילר עושה קופי פייסט של פונקציה מסוימת לתוך כמה מחלקות.
תחשוב שיש שלב באמצע של פיענוח השפה שמה שקורה בה זה שהמחשב משכתב את הקלאסים שלך ובכל קלאס שהוא מוצא בו את המילה trait הוא מוחק את השורה הזו ובמקומה עושה paste לקוד של המטודות שמוגדרות ב trait.
אין ביניהם קשר לאינטרפייסים, למחלקות אבסטרקטיות ולא לשום דבר אחר.
זה פשוט קופי פייסט. אם אחרי הקופיי פייסט יסתבר למחשב שחסר לך מטודה במחלקה שמבוקשת באינטרפייס
או שאחרי הקופי פייסט יתגלה שאין לך מימוש של איזה מטודה אבסטרקית שאמורה להיות - תקבל שגיאה.
לגבי פונקציות לעבודה עם מערכים, אתה בטוח שבכל מחלקה אמור להיות קופי פייסט של כמה מטודות לעבודה עם מערכים?
את החלק עם traits הבנתי, לא הבנתי את האינטרפייס והקלאס האבסטרקטי , פשוט למדתי על הכול ביחד אז הכנסתי ביחד את השאלה חח :) וזה היה סתם דוגמה...האמת שלא עולה לי רעיון לשימוש בtrait, למה זה עוזר בעצם ? איזה traits כבר צריך?
שאלה מעולה וזה מה שרוב האנשים שאולים את עצמם.
סינגלטון היא דוגמה אחת לפונקצינאליות שדי זהה בין מחלקה למחלקה.
נראה שאתה מעוניין בקטע הטכני - מה ההבדל בן Interface לבין Abstract Class טכנית, ולא לוגית. אז הנה, כתבתי תשובה.
Interface מציג דרישות כלפי חוץ, כלומר מה חייב להיות זמין מחוץ למחלקה (לכן זה רק public). יכול להיות בו מתודות וקבועים. לכל מחלקה שמיישמת Interface חייב להיות את כל המתודות והקבועים שיש ב-Interface (ושיוגדרו כ-public). אם המתודות מקבלות פרמטרים, למחלקה חייב להיות בדיוק אותו מספר פרמטרים (השם שלהם לא משנה), אבל המחלקה יכולה להוסיף פרמטרים שהם רשות (אחרי הפרמטרים שהם חובה).
Abstract Class זה למעשה מחלקה מופשטת. היא לא מציגה דרישות כלפי חוץ (כמו Interface), אלא מציגה דרישות למחלקה עצמה, לא משנה מה רמת הכימוס (public/protected/private). מכיוון שכך, היא יכולה להציע גם יישומים למתודות, ולא רק מתודות ללא יישום.
אי אפשר ליצור מופע של מחלקה שמוגדרת כ-Abstract, אלא רק לרשת ממנה. מחלקה מופשטת יכולה להכיל משתנים, קבועים ומתודות (כמו כל מחלקה), אבל אי אפשר להגדיר משתנים וקבועים כ-Abstract, אלא רק מתודות.
כמו ב-Interface, המתודות שהוגדרו כ-Abstract חייבות להופיע במחלקה היורשת (עם יישום שלהן) כאשר מספר הפרמטרים זהה, מלבד פרמטרים שהם רשות (שנמצאים בסוף הרשימה של הפרמטרים).
בניגוד ל-Interface, רמת הכימוס במתודה מופשטת יכולה להיות כל אחת מהרמות השונות. המחלקה היורשת חייבת ליישם את המתודות המופשטות באותה רמת כימוס שהן הוגדרו או ברמה מחמירה פחות. למשל, אם מתודה הוגדרה כ-protected, במחלקה היורשת היא יכולה להיות protected או public, אך לא private.
נוסף על כך, אפשר להוסיף למחלקה מופשטת מתודות רגילות (עם יישום), שהמחלקה היורשת תקבל כאילו ירשה אותן ממחלקה רגילה.